Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / android / app / src / main / java / com / meshchatx / rnode / RNodeFlasherActivity.java

Displaying Raw • Download


android/app/src/main/java/com/meshchatx/rnode/RNodeFlasherActivity.java HEAD (2bf00cb3) Text, 18.39 KB

Tff7b72package T7ee787com.meshchatx.rnodeTb4b4b4;

Tff7b72import T7ee787android.ManifestTb4b4b4;
Tff7b72import T7ee787android.content.IntentTb4b4b4;
Tff7b72import T7ee787android.content.SharedPreferencesTb4b4b4;
Tff7b72import T7ee787android.content.pm.PackageManagerTb4b4b4;
Tff7b72import T7ee787android.net.UriTb4b4b4;
Tff7b72import T7ee787android.os.BuildTb4b4b4;
Tff7b72import T7ee787android.os.BundleTb4b4b4;
Tff7b72import T7ee787android.os.HandlerTb4b4b4;
Tff7b72import T7ee787android.os.LooperTb4b4b4;
Tff7b72import T7ee787android.view.ViewTb4b4b4;
Tff7b72import T7ee787android.widget.AdapterViewTb4b4b4;
Tff7b72import T7ee787android.widget.ArrayAdapterTb4b4b4;
Tff7b72import T7ee787android.widget.ButtonTb4b4b4;
Tff7b72import T7ee787android.widget.ProgressBarTb4b4b4;
Tff7b72import T7ee787android.widget.SpinnerTb4b4b4;
Tff7b72import T7ee787android.widget.TextViewTb4b4b4;
Tff7b72import T7ee787android.widget.ToastTb4b4b4;

Tff7b72import T7ee787androidx.annotation.NullableTb4b4b4;
Tff7b72import T7ee787androidx.appcompat.app.AppCompatActivityTb4b4b4;
Tff7b72import T7ee787androidx.core.app.ActivityCompatTb4b4b4;
Tff7b72import T7ee787androidx.core.content.ContextCompatTb4b4b4;

Tff7b72import T7ee787com.meshchatx.AppSettingsLauncherTb4b4b4;
Tff7b72import T7ee787com.meshchatx.RTb4b4b4;

Tff7b72import T7ee787java.io.ByteArrayOutputStreamTb4b4b4;
Tff7b72import T7ee787java.io.FileTb4b4b4;
Tff7b72import T7ee787java.io.FileOutputStreamTb4b4b4;
Tff7b72import T7ee787java.io.InputStreamTb4b4b4;
Tff7b72import T7ee787java.util.ArrayListTb4b4b4;
Tff7b72import T7ee787java.util.ListTb4b4b4;
Tff7b72import T7ee787java.util.MapTb4b4b4;
Tff7b72import T7ee787java.util.concurrent.ExecutorServiceTb4b4b4;
Tff7b72import T7ee787java.util.concurrent.ExecutorsTb4b4b4;

T8b949e/**
* Fully native RNode flasher (USB serial + ESP32 ROM protocol).
* Launched from the WebView Tools page via MeshChatXAndroid.openRNodeFlasher().
*/
Tff7b72public Tff7b72final Tff7b72class T56d364RNodeFlasherActivity Tff7b72extends Te6edf3AppCompatActivity Tff7b72implements Te6edf3UsbSerialHubTb4b4b4.Te6edf3Listener Tb4b4b4{
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3REQ_BT Tff7b72= T79c0ff4401Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3REQ_PICK_FIRMWARE Tff7b72= T79c0ff4402Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Te6edf3String Te6edf3PREFS Tff7b72= Ta5d6ff"Ta5d6ffrnode_flasherTa5d6ff"Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Te6edf3String Te6edf3PREF_BT_PROMPTED Tff7b72= Ta5d6ff"Ta5d6ffbt_perm_promptedTa5d6ff"Tb4b4b4;

Tff7b72private Tff7b72final Te6edf3Handler Te6edf3mainHandler Tff7b72= Tff7b72new Te6edf3HandlerTb4b4b4(Te6edf3LooperTb4b4b4.Te6edf3getMainLooperTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72private Tff7b72final Te6edf3ExecutorService Te6edf3io Tff7b72= Te6edf3ExecutorsTb4b4b4.Te6edf3newSingleThreadExecutorTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72private Te6edf3UsbSerialHub Te6edf3usbHubTb4b4b4;
Tff7b72private Te6edf3ProductCatalog Te6edf3catalogTb4b4b4;
Tf0883e@Nullable
Tff7b72private Tffa657byteTff7b72[Tff7b72] Te6edf3firmwareBytesTb4b4b4;
Tf0883e@Nullable
Tff7b72private Te6edf3String Te6edf3firmwareNameTb4b4b4;

Tff7b72private Te6edf3Spinner Te6edf3usbSpinnerTb4b4b4;
Tff7b72private Te6edf3Spinner Te6edf3productSpinnerTb4b4b4;
Tff7b72private Te6edf3Spinner Te6edf3modelSpinnerTb4b4b4;
Tff7b72private Te6edf3ProgressBar Te6edf3progressBarTb4b4b4;
Tff7b72private Te6edf3TextView Te6edf3statusViewTb4b4b4;
Tff7b72private Te6edf3TextView Te6edf3logViewTb4b4b4;
Tff7b72private Te6edf3Button Te6edf3flashButtonTb4b4b4;
Tff7b72private Te6edf3Button Te6edf3downloadButtonTb4b4b4;

Tff7b72private Tff7b72final Te6edf3ListTff7b72<Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfoTff7b72> Te6edf3ports Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfoTff7b72> Te6edf3usbAdapterTb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3ProductCatalogTb4b4b4.Te6edf3ProductTff7b72> Te6edf3productAdapterTb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3ProductCatalogTb4b4b4.Te6edf3ModelTff7b72> Te6edf3modelAdapterTb4b4b4;

Tf0883e@Override
Tff7b72protected Tffa657void Td2a8ffonCreateTb4b4b4(Tf0883e@Nullable Te6edf3Bundle Te6edf3savedInstanceStateTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onCreateTb4b4b4(Te6edf3savedInstanceStateTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3setContentViewTb4b4b4(Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3activity_rnode_flasherTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setTitleTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_titleTb4b4b4)Tb4b4b4;
Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setDisplayHomeAsUpEnabledTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3usbSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeUsbSpinnerTb4b4b4)Tb4b4b4;
Te6edf3productSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeProductSpinnerTb4b4b4)Tb4b4b4;
Te6edf3modelSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeModelSpinnerTb4b4b4)Tb4b4b4;
Te6edf3progressBar Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeProgressTb4b4b4)Tb4b4b4;
Te6edf3statusView Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeStatusTb4b4b4)Tb4b4b4;
Te6edf3logView Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeLogTb4b4b4)Tb4b4b4;
Te6edf3flashButton Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeFlashTb4b4b4)Tb4b4b4;
Te6edf3downloadButton Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeDownloadFirmwareTb4b4b4)Tb4b4b4;

Te6edf3usbAdapter Tff7b72= Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Te6edf3portsTb4b4b4)Tb4b4b4;
Te6edf3usbSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3usbAdapterTb4b4b4)Tb4b4b4;

Tff7b72try Tb4b4b4{
Te6edf3catalog Tff7b72= Te6edf3ProductCatalogTb4b4b4.Te6edf3loadTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load product catalog: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3catalog Tff7b72= Te6edf3ProductCatalogTb4b4b4.Te6edf3emptyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3productAdapter Tff7b72=
Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(
Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Te6edf3catalogTb4b4b4.Te6edf3productsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3productSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3productAdapterTb4b4b4)Tb4b4b4;
Te6edf3modelAdapter Tff7b72=
Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(
Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3modelSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3modelAdapterTb4b4b4)Tb4b4b4;

Te6edf3productSpinnerTb4b4b4.Te6edf3setOnItemSelectedListenerTb4b4b4(
Tff7b72new Te6edf3AdapterViewTb4b4b4.Te6edf3OnItemSelectedListenerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonItemSelectedTb4b4b4(
Te6edf3AdapterViewTff7b72<Tff7b72?Tff7b72> Te6edf3parentTb4b4b4, Te6edf3View Te6edf3viewTb4b4b4, Tffa657int Te6edf3positionTb4b4b4, Tffa657long Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3refreshModelsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonNothingSelectedTb4b4b4(Te6edf3AdapterViewTff7b72<Tff7b72?Tff7b72> Te6edf3parentTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Tb4b4b4)Tb4b4b4;

Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRefreshUsbTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRequestUsbTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3requestUsbPermissionTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRequestBluetoothTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3requestBluetoothTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeOpenAppSettingsTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3openAppSettingsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3downloadButtonTb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3pickFirmwareFileTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3flashButtonTb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3flashSelectedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;

Te6edf3usbHub Tff7b72= Tff7b72new Te6edf3UsbSerialHubTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3addListenerTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3refreshModelsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffNative RNode flasher ready.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3msg Tff7b72=
Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)
Tff7b72? Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)
Tb4b4b4: Ta5d6ff"Ta5d6ffNative RNode flasher failed to startTa5d6ff"Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3msgTb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3finishTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657boolean Td2a8ffonSupportNavigateUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3finishTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72protected Tffa657void Td2a8ffonDestroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3usbHub Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3ioTb4b4b4.Te6edf3shutdownNowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72superTb4b4b4.Te6edf3onDestroyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonUsbPermissionResultTb4b4b4(Te6edf3String Te6edf3deviceIdTb4b4b4, Tffa657boolean Te6edf3grantedTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffUSB permission Ta5d6ff" Tff7b72+ Tb4b4b4(Te6edf3granted Tff7b72? Ta5d6ff"Ta5d6ffgrantedTa5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffdeniedTa5d6ff"Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff for Ta5d6ff" Tff7b72+ Te6edf3deviceIdTb4b4b4)Tb4b4b4;
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonPortsChangedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonRequestPermissionsResultTb4b4b4(Tffa657int Te6edf3requestCodeTb4b4b4, Te6edf3StringTff7b72[Tff7b72] Te6edf3permissionsTb4b4b4, Tffa657intTff7b72[Tff7b72] Te6edf3grantResultsTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onRequestPermissionsResultTb4b4b4(Te6edf3requestCodeTb4b4b4, Te6edf3permissionsTb4b4b4, Te6edf3grantResultsTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3requestCode Tff7b72!Tff7b72= Te6edf3REQ_BTTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tffa657boolean Te6edf3ok Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3grantResults Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3grantResultsTb4b4b4.Te6edf3length Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3ok Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3result Tb4b4b4: Te6edf3grantResultsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3ok Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3appendLogTb4b4b4(Te6edf3ok Tff7b72? Ta5d6ff"Ta5d6ffBluetooth permission granted.Ta5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffBluetooth permission denied.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3okTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffBluetooth allowedTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isBluetoothPermanentlyDeniedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth permanently denied. Opening app settings.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(
Tff7b72thisTb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth blocked. Enable it in app settings.Ta5d6ff"Tb4b4b4,
Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONG
Tb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3openBluetoothSettingsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffBluetooth deniedTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657boolean Td2a8ffisBluetoothPermanentlyDeniedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72< Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3STb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3StringTff7b72[Tff7b72] Te6edf3needed Tff7b72= Tff7b72new Te6edf3StringTff7b72[Tff7b72] Tb4b4b4{
Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_CONNECTTb4b4b4,
Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_SCANTb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3SharedPreferences Te6edf3prefs Tff7b72= Te6edf3getSharedPreferencesTb4b4b4(Te6edf3PREFSTb4b4b4, Te6edf3MODE_PRIVATETb4b4b4)Tb4b4b4;
Tffa657boolean Te6edf3prompted Tff7b72= Te6edf3prefsTb4b4b4.Te6edf3getBooleanTb4b4b4(Te6edf3PREF_BT_PROMPTEDTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3String Te6edf3permission Tb4b4b4: Te6edf3neededTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3permissionTb4b4b4)
Tff7b72=Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3prompted Tff7b72&Tff7b72& Tff7b72!Te6edf3ActivityCompatTb4b4b4.Te6edf3shouldShowRequestPermissionRationaleTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3permissionTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffrequestBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72< Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3STb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth runtime permission not required on this Android version.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffBluetooth already allowed on this Android versionTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)
Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3ListTff7b72<Te6edf3StringTff7b72> Te6edf3missing Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_CONNECTTb4b4b4)
Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3missingTb4b4b4.Te6edf3addTb4b4b4(Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_CONNECTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_SCANTb4b4b4)
Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3missingTb4b4b4.Te6edf3addTb4b4b4(Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_SCANTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3missingTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth permission already granted.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffBluetooth already allowedTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isBluetoothPermanentlyDeniedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth permanently denied. Opening app settings.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(
Tff7b72thisTb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth blocked. Enable it in app settings.Ta5d6ff"Tb4b4b4,
Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONG
Tb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3openBluetoothSettingsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3getSharedPreferencesTb4b4b4(Te6edf3PREFSTb4b4b4, Te6edf3MODE_PRIVATETb4b4b4)Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3putBooleanTb4b4b4(Te6edf3PREF_BT_PROMPTEDTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ActivityCompatTb4b4b4.Te6edf3requestPermissionsTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3missingTb4b4b4.Te6edf3toArrayTb4b4b4(Tff7b72new Te6edf3StringTff7b72[T79c0ff0Tff7b72]Tb4b4b4)Tb4b4b4, Te6edf3REQ_BTTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffRequesting Bluetooth permissions…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffopenAppSettingsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppSettingsLauncherTb4b4b4.Te6edf3openAppDetailsTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffopenBluetoothSettingsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppSettingsLauncherTb4b4b4.Te6edf3openBluetoothSettingsTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffrefreshPortsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3portsTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3portsTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3usbHubTb4b4b4.Te6edf3listPortsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3usbAdapterTb4b4b4.Te6edf3notifyDataSetChangedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3portsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_no_usbTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3portsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff USB serial device(s)Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffrefreshModelsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3modelAdapterTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Te6edf3product Tff7b72= Te6edf3selectedProductTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3product Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3modelAdapterTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3productTb4b4b4.Te6edf3modelsTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3modelAdapterTb4b4b4.Te6edf3notifyDataSetChangedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffrequestUsbPermissionTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Te6edf3port Tff7b72= Te6edf3selectedPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tffa657boolean Te6edf3any Tff7b72= Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3usbHubTb4b4b4.Te6edf3requestPermissionsForAllTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Te6edf3any Tff7b72? Ta5d6ff"Ta5d6ffRequested USB permissions.Ta5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffNo USB devices need permission.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3portTb4b4b4.Te6edf3hasPermissionTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffUSB already allowed for Ta5d6ff" Tff7b72+ Te6edf3portTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3requestPermissionTb4b4b4(Te6edf3portTb4b4b4.Te6edf3deviceIdTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffRequested USB permission for Ta5d6ff" Tff7b72+ Te6edf3portTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffpickFirmwareFileTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Intent Te6edf3intent Tff7b72= Tff7b72new Te6edf3IntentTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3ACTION_GET_CONTENTTb4b4b4)Tb4b4b4;
Te6edf3intentTb4b4b4.Te6edf3setTypeTb4b4b4(Ta5d6ff"Ta5d6ffapplication/zipTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3intentTb4b4b4.Te6edf3addCategoryTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3CATEGORY_OPENABLETb4b4b4)Tb4b4b4;
Te6edf3startActivityForResultTb4b4b4(
Te6edf3IntentTb4b4b4.Te6edf3createChooserTb4b4b4(Te6edf3intentTb4b4b4, Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_pick_firmwareTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3REQ_PICK_FIRMWARE
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72protected Tffa657void Td2a8ffonActivityResultTb4b4b4(Tffa657int Te6edf3requestCodeTb4b4b4, Tffa657int Te6edf3resultCodeTb4b4b4, Tf0883e@Nullable Te6edf3Intent Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onActivityResultTb4b4b4(Te6edf3requestCodeTb4b4b4, Te6edf3resultCodeTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3requestCode Tff7b72!Tff7b72= Te6edf3REQ_PICK_FIRMWARE Tff7b72|Tff7b72| Te6edf3resultCode Tff7b72!Tff7b72= Te6edf3RESULT_OK Tff7b72|Tff7b72| Te6edf3data Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3Uri Te6edf3uri Tff7b72= Te6edf3dataTb4b4b4.Te6edf3getDataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3uri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_pick_failedTb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3setBusyTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_loading_firmwareTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3ioTb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72try Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3bytesTb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3InputStream Te6edf3in Tff7b72= Te6edf3getContentResolverTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3in Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffCould not open firmware fileTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ByteArrayOutputStream Te6edf3out Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3buf Tff7b72= Tff7b72new Tffa657byteTff7b72[T79c0ff8192Tff7b72]Tb4b4b4;
Tffa657int Te6edf3nTb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3n Tff7b72= Te6edf3inTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4) Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3bytes Tff7b72= Te6edf3outTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3rawName Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getLastPathSegmentTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72final Te6edf3String Te6edf3name Tff7b72= Tb4b4b4(Te6edf3rawName Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3rawNameTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72? Ta5d6ff"Ta5d6fffirmware.zipTa5d6ff" Tb4b4b4: Te6edf3rawNameTb4b4b4;
Te6edf3File Te6edf3cache Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Te6edf3getCacheDirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3FileOutputStream Te6edf3fos Tff7b72= Tff7b72new Te6edf3FileOutputStreamTb4b4b4(Te6edf3cacheTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fosTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bytesTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3firmwareBytes Tff7b72= Te6edf3bytesTb4b4b4;
Te6edf3firmwareName Tff7b72= Te6edf3nameTb4b4b4;
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_firmware_readyTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3bytesTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFirmware ready: Ta5d6ff" Tff7b72+ Te6edf3cacheTb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_pick_failedTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFirmware load error: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffflashSelectedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Te6edf3port Tff7b72= Te6edf3selectedPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Te6edf3product Tff7b72= Te6edf3selectedProductTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Te6edf3model Tff7b72= Te6edf3selectedModelTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_no_usbTb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3product Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffSelect a productTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3MapTff7b72<Te6edf3StringTb4b4b4, Te6edf3StringTff7b72> Te6edf3flashFiles Tff7b72= Te6edf3productTb4b4b4.Te6edf3resolveFlashFilesTb4b4b4(Te6edf3modelTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3flashFiles Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3flashFilesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffNo ESP flash map for this product (nRF52 not in MVP)Ta5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)
Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3firmwareBytes Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffDownload firmware firstTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3setBusyTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_busyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72final Tffa657byteTff7b72[Tff7b72] Te6edf3zip Tff7b72= Te6edf3firmwareBytesTb4b4b4;
Tff7b72final Te6edf3String Te6edf3deviceId Tff7b72= Te6edf3portTb4b4b4.Te6edf3deviceIdTb4b4b4;
Te6edf3ioTb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3ListTff7b72<Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3ImageTff7b72> Te6edf3images Tff7b72=
Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3imagesFromZipTb4b4b4(Te6edf3zipTb4b4b4, Te6edf3flashFilesTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3openTb4b4b4(Te6edf3deviceIdTb4b4b4, T79c0ff115200Tb4b4b4)Tb4b4b4;
Te6edf3Esp32SerialFlasher Te6edf3flasher Tff7b72=
Tff7b72new Te6edf3Esp32SerialFlasherTb4b4b4(
Te6edf3usbHubTb4b4b4,
Tff7b72new Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3ProgressTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonStatusTb4b4b4(Te6edf3String Te6edf3messageTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonProgressTb4b4b4(Tffa657int Te6edf3percentTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3progressBarTb4b4b4.Te6edf3setProgressTb4b4b4(Te6edf3percentTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Te6edf3flasherTb4b4b4.Te6edf3flashTb4b4b4(Te6edf3imagesTb4b4b4, T79c0ff460800Tb4b4b4)Tb4b4b4;
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffFlash completeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffFlash completeTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffFlash failedTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFlash error: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Nullable
Tff7b72private Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Td2a8ffselectedPortTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3idx Tff7b72= Te6edf3usbSpinnerTb4b4b4.Te6edf3getSelectedItemPositionTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3idx Tff7b72< T79c0ff0 Tff7b72|Tff7b72| Te6edf3idx Tff7b72>Tff7b72= Te6edf3portsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3portsTb4b4b4.Te6edf3getTb4b4b4(Te6edf3idxTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Nullable
Tff7b72private Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Td2a8ffselectedProductTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Object Te6edf3item Tff7b72= Te6edf3productSpinnerTb4b4b4.Te6edf3getSelectedItemTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3item Tff7b72instanceof Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Tff7b72? Tb4b4b4(Te6edf3ProductCatalogTb4b4b4.Te6edf3ProductTb4b4b4) Te6edf3item Tb4b4b4: Tff7b72nullTb4b4b4;
Tb4b4b4}

Tf0883e@Nullable
Tff7b72private Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Td2a8ffselectedModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Object Te6edf3item Tff7b72= Te6edf3modelSpinnerTb4b4b4.Te6edf3getSelectedItemTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3item Tff7b72instanceof Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Tff7b72? Tb4b4b4(Te6edf3ProductCatalogTb4b4b4.Te6edf3ModelTb4b4b4) Te6edf3item Tb4b4b4: Tff7b72nullTb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffsetBusyTb4b4b4(Tffa657boolean Te6edf3busyTb4b4b4) Tb4b4b4{
Te6edf3flashButtonTb4b4b4.Te6edf3setEnabledTb4b4b4(Tff7b72!Te6edf3busyTb4b4b4)Tb4b4b4;
Te6edf3downloadButtonTb4b4b4.Te6edf3setEnabledTb4b4b4(Tff7b72!Te6edf3busyTb4b4b4)Tb4b4b4;
Te6edf3progressBarTb4b4b4.Te6edf3setIndeterminateTb4b4b4(Te6edf3busy Tff7b72&Tff7b72& Te6edf3progressBarTb4b4b4.Te6edf3getProgressTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffsetStatusTb4b4b4(Te6edf3String Te6edf3textTb4b4b4) Tb4b4b4{
Te6edf3statusViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72private Tffa657void Td2a8ffappendLogTb4b4b4(Te6edf3String Te6edf3lineTb4b4b4) Tb4b4b4{
Te6edf3CharSequence Te6edf3existing Tff7b72= Te6edf3logViewTb4b4b4.Te6edf3getTextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3existing Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3existingTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3logViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3logViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3existing Tff7b72+ Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+ Te6edf3lineTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────